ãšã©ãŒå¢çåè©Šè¡æŠç¥ã䜿çšããŠãå ç¢ãªReactã¢ããªã±ãŒã·ã§ã³ãå®è£ ããŸãããšã©ãŒããèªåçã«å埩ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããæ¹æ³ãåŠã³ãŸãã
Reactãšã©ãŒå¢çåè©Šè¡æŠç¥ïŒèªåãšã©ãŒå埩
å ç¢ã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã«ã¯ããšã©ãŒåŠçãæ éã«æ€èšããå¿ èŠããããŸããäºæããªããšã©ãŒã¯ããŠãŒã¶ãŒã«äžæºãäžããéèŠãªã¢ããªã±ãŒã·ã§ã³æ©èœãäžæãããå¯èœæ§ããããŸããReactã®ãšã©ãŒå¢çã¯ãšã©ãŒãé©åã«ãã£ããããã¡ã«ããºã ãæäŸããŸããããšã©ãŒããèªåçã«å埩ããæ¹æ³ãæ¬è³ªçã«æäŸããããã§ã¯ãããŸããããã®èšäºã§ã¯ããšã©ãŒå¢çå ã«åè©Šè¡æŠç¥ãå®è£ ããŠãã¢ããªã±ãŒã·ã§ã³ãäžæçãªãšã©ãŒããèªåçã«å埩ã詊ã¿ãã°ããŒãã«ãªèŠèŽè å šäœã§å šäœçãªå埩åãåäžãããæ¹æ³ã«ã€ããŠèª¬æããŸãã
Reactãšã©ãŒå¢çã®çè§£
Reactãšã©ãŒå¢çã¯ãåã³ã³ããŒãã³ãããªãŒå ã®JavaScriptãšã©ãŒããã£ãããããããã®ãšã©ãŒããã°ã«èšé²ããã¢ããªã±ãŒã·ã§ã³å šäœãã¯ã©ãã·ã¥ããã代ããã«ãã©ãŒã«ããã¯UIã衚瀺ããReactã³ã³ããŒãã³ãã§ãããããã¯ã壿» çãªé害ãé²ããè¯å®çãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãç¶æããããã®éèŠãªããŒã«ã§ãããã ããããã©ã«ãã§ã¯ããšã©ãŒå¢çã¯ãšã©ãŒãçºçããåŸã«ãã©ãŒã«ããã¯UIã衚瀺ããæ¹æ³ã®ã¿ãæäŸããŸããæ ¹æ¬çãªåé¡ã®èªå解決ã¯è©Šè¡ããŸããã
ãšã©ãŒå¢çã¯éåžžãstatic getDerivedStateFromError()ããã³componentDidCatch()ã©ã€ããµã€ã¯ã«ã¡ãœãããå®çŸ©ããã¯ã©ã¹ã³ã³ããŒãã³ããšããŠå®è£
ãããŸãã
static getDerivedStateFromError(error): ãã®éçã¡ãœããã¯ãåå«ã³ã³ããŒãã³ãã«ãã£ãŠãšã©ãŒãã¹ããŒãããåŸã«åŒã³åºãããŸããã¹ããŒããããšã©ãŒãåŒæ°ãšããŠåãåããã³ã³ããŒãã³ãã®ç¶æ ãæŽæ°ããŠãšã©ãŒãçºçããããšã瀺ãå€ãè¿ãå¿ èŠããããŸããcomponentDidCatch(error, info): ãã®ã©ã€ããµã€ã¯ã«ã¡ãœããã¯ãåå«ã³ã³ããŒãã³ãã«ãã£ãŠãšã©ãŒãã¹ããŒãããåŸã«åŒã³åºãããŸããã¹ããŒããããšã©ãŒãšãã©ã®ã³ã³ããŒãã³ãããšã©ãŒãã¹ããŒãããã«é¢ããæ å ±ãå«ããªããžã§ã¯ããåãåããŸãããšã©ãŒã®ãã°èšé²ãŸãã¯å¯äœçšã®å®è¡ã«äœ¿çšã§ããŸãã
äŸïŒåºæ¬çãªãšã©ãŒå¢çã®å®è£
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = {
hasError: false
};
}
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return {
hasError: true
};
}
componentDidCatch(error, info) {
// Example "componentStack":
// in ComponentThatThrows (created by App)
// in div (created by App)
// in App
console.error("Error caught by ErrorBoundary:", error, info.componentStack);
// You can also log the error to an error reporting service
// logErrorToMyService(error, info.componentStack);
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return Something went wrong. Please try again later.
;
}
return this.props.children;
}
}
export default ErrorBoundary;
åè©Šè¡æŠç¥ã®å¿ èŠæ§
Webã¢ããªã±ãŒã·ã§ã³ã§çºçããå€ãã®ãšã©ãŒã¯ãæ¬è³ªçã«äžæçãªãã®ã§ãããããã®ãšã©ãŒã¯ãäžæçãªãããã¯ãŒã¯ã®åé¡ãéè² è·ã®ãµãŒããŒããŸãã¯å€éšAPIã«ãã£ãŠèª²ãããã¬ãŒãå¶éã«ãã£ãŠçºçããå¯èœæ§ããããŸãããããã®å Žåããã©ãŒã«ããã¯UIã衚瀺ããã ãã§ã¯æé©ãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããããããŠãŒã¶ãŒãã¬ã³ããªãŒãªã¢ãããŒãã¯ã倱æããæäœãèªåçã«å詊è¡ãããŠãŒã¶ãŒã®ä»å ¥ãå¿ èŠãšããã«åé¡ã解決ã§ããå¯èœæ§ãããããšã§ãã
次ã®ã·ããªãªãæ€èšããŠãã ããã
- ãããã¯ãŒã¯ã®äžå®å®ã: ã€ã³ã¿ãŒãããæ¥ç¶ãäžå®å®ãªå°åã®ãŠãŒã¶ãŒã¯ãæç¶çãªãããã¯ãŒã¯ãšã©ãŒãçºçããå¯èœæ§ããããŸãã倱æããAPIãªã¯ãšã¹ããå詊è¡ãããšããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå€§å¹ ã«åäžããŸããããšãã°ãã€ã³ããã·ã¢ã®ãžã£ã«ã«ã¿ãŸãã¯ãã€ãžã§ãªã¢ã®ã©ãŽã¹ã®ãŠãŒã¶ãŒã¯ããããã¯ãŒã¯ã®é å»¶ãé »ç¹ã«çºçããå¯èœæ§ããããŸãã
- APIã¬ãŒãå¶é: å€éšAPIïŒã°ããŒãã«å€©æ°ãµãŒãã¹ããã®å€©æ°ããŒã¿ã®ååŸãStripeãPayPalãªã©ã®æ±ºæžã²ãŒããŠã§ã€ãä»ããæ¯æãã®åŠçãªã©ïŒãšå¯Ÿè©±ããå Žåãã¬ãŒãå¶éãè¶ ãããšäžæçãªãšã©ãŒãçºçããå¯èœæ§ããããŸããé å»¶åŸã«ãªã¯ãšã¹ããå詊è¡ãããšããã®åé¡ã解決ãããããšããããããŸããäžçäžã®ãã©ãã¯ãã©ã€ããŒã»ãŒã«ã§äžè¬çãªããŒã¯æã«å€§éã®ãã©ã³ã¶ã¯ã·ã§ã³ãåŠçããã¢ããªã±ãŒã·ã§ã³ã¯ãã¬ãŒãå¶éã«éããå¯èœæ§ããããŸãã
- äžæçãªãµãŒããŒéè² è·: ãã©ãã£ãã¯ã®æ¥å¢ã«ããããµãŒããŒãäžæçã«éè² è·ã«ãªãå¯èœæ§ããããŸããçãé å»¶ã®åŸã«ãªã¯ãšã¹ããå詊è¡ãããšããµãŒããŒãå埩ããæéã皌ãããšãã§ããŸããããã¯ãäžçäžã®è£œåã®çºå£²ãŸãã¯ããã¢ãŒã·ã§ã³ã€ãã³ãäžã«äžè¬çãªã·ããªãªã§ãã
ãšã©ãŒå¢çå ã«åè©Šè¡æŠç¥ãå®è£ ããããšã§ãã¢ããªã±ãŒã·ã§ã³ã¯ãããã®ã¿ã€ãã®äžæçãªãšã©ãŒãé©åã«åŠçããããã·ãŒã ã¬ã¹ã§å埩åã®ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸã§ããŸãã
ãšã©ãŒå¢çå ã§ã®åè©Šè¡æŠç¥ã®å®è£
Reactãšã©ãŒå¢çå ã«åè©Šè¡æŠç¥ãå®è£ ããæ¹æ³ã次ã«ç€ºããŸãã
- ãšã©ãŒç¶æ ãšå詊è¡åæ°ã远跡ãã: ãšã©ãŒãçºçãããã©ãããšå詊è¡åæ°ã远跡ããããã«ãšã©ãŒå¢çã³ã³ããŒãã³ãã倿ŽããŸãã
- å詊è¡é¢æ°ãå®è£ ãã: åã³ã³ããŒãã³ãããªãŒã®åã¬ã³ããªã³ã°ã詊ã¿ããããšã©ãŒã®åå ãšãªã£ãæäœãåå®è¡ãã颿°ãäœæããŸãã
setTimeoutã䜿çšããŠé å»¶å詊è¡ãè¡ã: ã·ã¹ãã ãžã®è² è·ãåé¿ããããã«ãsetTimeoutã䜿çšããŠãé å»¶ãå¢å ããïŒææ°ããã¯ãªãïŒå詊è¡ãã¹ã±ãžã¥ãŒã«ããŸãã- å詊è¡åæ°ãå¶éãã: ãšã©ãŒã解決ããªãå Žåã«ç¡éã«ãŒããé²ãããã«ãæå€§å詊è¡åæ°ãå®è£ ããŸãã
- ãŠãŒã¶ãŒãã£ãŒãããã¯ãæäŸãã: ã¢ããªã±ãŒã·ã§ã³ããšã©ãŒããã®å埩ã詊ã¿ãŠããããšã瀺ãæçãªã¡ãã»ãŒãžããŠãŒã¶ãŒã«è¡šç€ºããŸãã
äŸïŒåè©Šè¡æŠç¥ãåãããšã©ãŒå¢ç
import React from 'react';
class ErrorBoundaryWithRetry extends React.Component {
constructor(props) {
super(props);
this.state = {
hasError: false,
error: null,
errorInfo: null,
retryCount: 0
};
this.retry = this.retry.bind(this);
}
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return {
hasError: true,
error: error
};
}
componentDidCatch(error, info) {
// You can also log the error to an error reporting service
console.error("Error caught by ErrorBoundary:", error, info.componentStack);
this.setState({
errorInfo: info
});
this.retry();
}
retry() {
const maxRetries = this.props.maxRetries || 3; // Allow configurable max retries
const delayBase = this.props.delayBase || 1000; // Allow configurable base delay
if (this.state.retryCount < maxRetries) {
const delay = delayBase * Math.pow(2, this.state.retryCount); // Exponential backoff
this.setState(prevState => ({
retryCount: prevState.retryCount + 1
}), () => {
setTimeout(() => {
this.setState({
hasError: false,
error: null,
errorInfo: null
}); // Reset error state to trigger re-render
}, delay);
});
} else {
// Max retries reached, display error message
console.warn("Max retries reached for ErrorBoundary.");
}
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return (
Something went wrong.
Error: {this.state.error && this.state.error.toString()}
Retry attempt: {this.state.retryCount}
{this.state.retryCount < (this.props.maxRetries || 3) ? (
Retrying in {this.props.delayBase ? this.props.delayBase * Math.pow(2, this.state.retryCount) : 1000 * Math.pow(2, this.state.retryCount)}ms...
) : (
Maximum retry attempts reached. Please try again later.
)}
{this.state.errorInfo && this.props.debug &&
{this.state.errorInfo.componentStack}
}
);
}
return this.props.children;
}
}
export default ErrorBoundaryWithRetry;
説æ:
ErrorBoundaryWithRetryã³ã³ããŒãã³ãã¯ãhasErrorç¶æ ããšã©ãŒèªäœããšã©ãŒæ å ±ãããã³retryCountã远跡ããŸããretry()颿°ã¯ãé å»¶åŸïŒææ°ããã¯ãªãã䜿çšïŒã«åã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ãã¹ã±ãžã¥ãŒã«ããŸããé å»¶ã¯ãå詊è¡ããšã«å¢å ããŸãïŒ1ç§ã2ç§ã4ç§ãªã©ïŒãmaxRetriesããããã£ïŒããã©ã«ãã¯3ïŒã¯ãå詊è¡åæ°ãå¶éããŸãã- ã³ã³ããŒãã³ãã¯ãå埩ã詊ã¿ãŠããããšã瀺ããŠãŒã¶ãŒãã¬ã³ããªãŒãªã¡ãã»ãŒãžã衚瀺ããŸãã
delayBaseããããã£ã䜿çšãããšãåæé å»¶ã調æŽã§ããŸããdebugããããã£ã䜿çšãããšãcomponentDidCatchã§ã³ã³ããŒãã³ãã¹ã¿ãã¯ã衚瀺ã§ããŸãã
äœ¿çšæ³:
import ErrorBoundaryWithRetry from './ErrorBoundaryWithRetry';
function MyComponent() {
// Simulate an error
const [shouldThrow, setShouldThrow] = React.useState(false);
if (shouldThrow) {
throw new Error("Simulated error!");
}
return (
This is a component that might throw an error.
);
}
function App() {
return (
);
}
export default App;
åè©Šè¡æŠç¥ã®ãã¹ããã©ã¯ãã£ã¹
åè©Šè¡æŠç¥ãå®è£ ããå Žåã¯ã次ã®ãã¹ããã©ã¯ãã£ã¹ãæ€èšããŠãã ããã
- ææ°ããã¯ãªã: ææ°ããã¯ãªãã䜿çšããŠãã·ã¹ãã ãžã®è² è·ãåé¿ããŸãããµãŒããŒãå埩ããæéã皌ãããã«ãå詊è¡éã®é å»¶ãå¢ãããŸãã
- ãžãã¿ãŒ: å°éã®ã©ã³ãã æ§ïŒãžãã¿ãŒïŒãå詊è¡é å»¶ã«è¿œå ããŠãè€æ°ã®ã¯ã©ã€ã¢ã³ãããŸã£ããåãæéã«å詊è¡ããããšãé²ããŸããããã«ãããåé¡ãæªåããå¯èœæ§ããããŸãã
- åªçæ§: å詊è¡ããæäœãåªçã§ããããšã確èªããŸããåªçæäœã¯ãæåã®é©çšãè¶ ããŠçµæã倿Žããã«è€æ°åå®è¡ã§ããŸããããšãã°ãããŒã¿ã®èªã¿åãã¯åªçã§ãããæ°ããã¬ã³ãŒãã®äœæã¯åªçã§ã¯ãªãå¯èœæ§ããããŸããæ°ããã¬ã³ãŒãã®äœæã*åªçã§ãªã*å Žåã¯ãã¬ã³ãŒããæ¢ã«ååšãããã©ããã確èªããŠãéè€ããŒã¿ãåé¿ããææ®µãå¿ èŠã§ãã
- ãµãŒããããã¬ãŒã«ãŒãã¿ãŒã³: ãµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ãå®è£ ããŠã倱æããæäœãç¡æéã«å詊è¡ããããšãé²ãããšãæ€èšããŠãã ãããäžå®åæ°ã®é£ç¶ãã倱æã®åŸããµãŒããããã¬ãŒã«ãŒãéããäžå®æéå詊è¡ã鲿¢ãããŸããããã¯ãã«ã¹ã±ãŒãé害ããã·ã¹ãã ãä¿è·ããã®ã«åœ¹ç«ã¡ãŸãã
- ãã°èšé²ãšç£èŠ: åè©Šè¡æŠç¥ã®å¹æãç£èŠããæœåšçãªåé¡ãç¹å®ããããã«ãå詊è¡ã®è©Šè¡ãšå€±æããã°ã«èšé²ããŸããSentryãBugsnagãNew Relicãªã©ã®ããŒã«ã䜿çšããŠããšã©ãŒãšããã©ãŒãã³ã¹ã远跡ããŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹: å詊è¡ã®è©Šè¡äžã«ãæç¢ºã§æçãªãã£ãŒãããã¯ããŠãŒã¶ãŒã«æäŸããŸããã³ã³ããã¹ããæäŸããªãäžè¬çãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ããããšã¯é¿ããŠãã ãããã¢ããªã±ãŒã·ã§ã³ããšã©ãŒããã®å埩ã詊ã¿ãŠããããšããŠãŒã¶ãŒã«ç¥ãããŸããèªåå詊è¡ã倱æããå Žåã«åããŠãæåã®å詊è¡ãã¿ã³ã远å ããããšãæ€èšããŠãã ããã
- æ§æ: å詊è¡ãã©ã¡ãŒã¿ãŒïŒäŸïŒ
maxRetriesãdelayBaseïŒãç°å¢å€æ°ãŸãã¯æ§æãã¡ã€ã«ãä»ããŠæ§æå¯èœã«ããŸããããã«ãããã³ãŒãã倿Žããã«åè©Šè¡æŠç¥ã調æŽã§ããŸããç°å¢å€æ°ãªã©ã®ã°ããŒãã«æ§æãæ€èšããŠãã ãããããã«ãããã¢ããªã±ãŒã·ã§ã³ãåã³ã³ãã€ã«ããå¿ èŠãªãæ§æãåçã«å€æŽã§ããããŸããŸãªåè©Šè¡æŠç¥ã®A/Bãã¹ãããäžçã®ããŸããŸãªå°åã®ããŸããŸãªãããã¯ãŒã¯æ¡ä»¶ãžã®å¯Ÿå¿ãå¯èœã«ãªããŸãã
ã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ãªèŠèŽè åãã®åè©Šè¡æŠç¥ãèšèšããå Žåã¯ã次ã®èŠçŽ ãèæ ®ããŠãã ããã
- ãããã¯ãŒã¯ç¶æ
: ãããã¯ãŒã¯æ¥ç¶ã¯ãå°åã«ãã£ãŠå€§ããç°ãªãå ŽåããããŸããã€ã³ã¿ãŒãããã¢ã¯ã»ã¹ãäžå®å®ãªå°åã®ãŠãŒã¶ãŒã¯ãããé »ç¹ã«ãšã©ãŒãçºçããå¯èœæ§ããããŸããããã«å¿ããŠå詊è¡ãã©ã¡ãŒã¿ãŒã調æŽããŸããããšãã°ã蟲æå°åãçºå±éäžåœãªã©ããããã¯ãŒã¯ã®äžå®å®ããç¥ãããŠããå°åã§ãŠãŒã¶ãŒã«ãµãŒãã¹ãæäŸããã¢ããªã±ãŒã·ã§ã³ã¯ã
maxRetriesãé«ãããããdelayBaseãé·ãããããšããå§ãããŸãã - ã¬ã€ãã³ã·ãŒ: é«ãã¬ã€ãã³ã·ãŒã¯ãã¿ã€ã ã¢ãŠããšãšã©ãŒã®å¯èœæ§ãé«ããå¯èœæ§ããããŸããã¢ããªã±ãŒã·ã§ã³ãšãã¢ããªã±ãŒã·ã§ã³ãäŸåãããµãŒãã¹éã®ã¬ã€ãã³ã·ãŒãèæ ®ããŠãã ãããããšãã°ããªãŒã¹ãã©ãªã¢ããç±³åœã®ãµãŒããŒã«ã¢ã¯ã»ã¹ãããŠãŒã¶ãŒã¯ãç±³åœã«ãããŠãŒã¶ãŒãããé«ãã¬ã€ãã³ã·ãŒãçºçããŸãã
- ã¿ã€ã ãŸãŒã³: å詊è¡ãã¹ã±ãžã¥ãŒã«ãããšãã¯ãã¿ã€ã ãŸãŒã³ã«æ³šæããŠãã ãããç¹å®ã®å°åã§ããŒã¯æã«æäœãå詊è¡ããããšã¯é¿ããŠãã ãããAPIãããã€ããŒã¯ãäžçã®ããŸããŸãªå°åã§ç°ãªãããŒã¯ãã©ãã£ãã¯æéãçºçããå¯èœæ§ããããŸãã
- APIã®å¯çšæ§: äžéšã®APIã«ã¯ãå°åçãªåæ¢ãŸãã¯ã¡ã³ããã³ã¹ãŠã£ã³ããŠãããå ŽåããããŸããAPIã®å¯çšæ§ãç£èŠããããã«å¿ããŠåè©Šè¡æŠç¥ã調æŽããŸããã¢ããªã±ãŒã·ã§ã³ãäŸåãããµãŒãããŒãã£APIã®ã¹ããŒã¿ã¹ããŒãžã宿çã«ãã§ãã¯ããŠãæœåšçãªå°åçãªåæ¢ãŸãã¯ã¡ã³ããã³ã¹ãŠã£ã³ããŠãç¹å®ããŸãã
- æåã®éã: ã°ããŒãã«ãªèŠèŽè ã®ããŸããŸãªæåçèæ¯ã«çæããŠãã ããããšã©ãŒã«å¯Ÿããå¯å®¹åºŠãç°ãªãæåããããŸãããšã©ãŒã¡ãã»ãŒãžãšãŠãŒã¶ãŒãã£ãŒãããã¯ããæåçã«ææã«ãªãããã«èª¿æŽããŸããããŸããŸãªæåã®ãŠãŒã¶ãŒã«ãšã£ãŠçŽãããããŸãã¯æ»æçãªå¯èœæ§ã®ããèšèªã¯é¿ããŠãã ããã
代æ¿ã®å詊è¡ã©ã€ãã©ãª
åè©Šè¡æŠç¥ãæåã§å®è£ ããããšãã§ããŸãããããã€ãã®ã©ã€ãã©ãªã䜿çšãããšãããã»ã¹ãç°¡çŽ åã§ããŸãã
axios-retry: 倱æãããªã¯ãšã¹ããèªåçã«å詊è¡ããAxios HTTPã¯ã©ã€ã¢ã³ãã®ãã©ã°ã€ã³ãp-retry: Node.jsããã³ãã©ãŠã¶ãŒåãã®PromiseããŒã¹ã®å詊è¡é¢æ°ãretry: Node.jsåãã®æ±çšå詊è¡ã©ã€ãã©ãªã
ãããã®ã©ã€ãã©ãªã¯ãææ°ããã¯ãªãããžãã¿ãŒããµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ãªã©ã®æ©èœãæäŸããå ç¢ãªåè©Šè¡æŠç¥ãããç°¡åã«å®è£ ã§ããããã«ããŸãããã ãããããã®ã©ã€ãã©ãªããšã©ãŒå¢çã«çŽæ¥çµ±åããã«ã¯ããšã©ãŒå¢çããšã©ãŒç¶æ ã®*衚瀺*ãåŠçãããããã«ã¹ã¿ã ã³ãŒãã£ã³ã°ãå¿ èŠã«ãªãå ŽåããããŸãã
çµè«
Reactãšã©ãŒå¢çå ã§åè©Šè¡æŠç¥ãå®è£ ããããšã¯ãå埩åããããŠãŒã¶ãŒãã¬ã³ããªãŒãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ããäžæçãªãšã©ãŒããèªåçã«å埩ã詊ã¿ãããšã§ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå€§å¹ ã«åäžããã壿» çãªé害ãé²ãããšãã§ããŸããææ°ããã¯ãªãããžãã¿ãŒããµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ãªã©ã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããã°ããŒãã«ãªèŠèŽè ã®ç¹å®ã®ããŒãºã«åãããŠæŠç¥ã調æŽããããšãå¿ããªãã§ãã ããããšã©ãŒå¢çãå ç¢ãªå詊è¡ã¡ã«ããºã ãšçµã¿åãããããšã§ãã€ã³ã¿ãŒãããã®çµ¶ãéãªãå€åããç¶æ³ã«å¯ŸããŠãããä¿¡é Œæ§ãé«ãé©å¿æ§ã®ããReactã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
å æ¬çãªãšã©ãŒåŠçæŠç¥ãæ³šææ·±ãèšç»ããã³å®è£ ããããšã§ãReactã¢ããªã±ãŒã·ã§ã³ãããŠãŒã¶ãŒã®å Žæããããã¯ãŒã¯ç¶æ ã«é¢ä¿ãªããè¯å®çã§ä¿¡é Œæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããšãä¿èšŒã§ããŸãããããã®æŠç¥ã䜿çšãããšããŠãŒã¶ãŒã®äžæºã軜æžãããã ãã§ãªãããµããŒãã³ã¹ããåæžãããã¢ããªã±ãŒã·ã§ã³å šäœã®å®å®æ§ãåäžããŸãã